import json
import os

from util import llm
from util.entity import Article

MODEL_NAME = os.getenv('MODEL_NAME', "deepseek-chat")

# 应急预案生成的系统提示词
SYSTEM_PROMPT = """你是一个专业的应急预案生成专家，可以根据事件类型和事件子类，结合知识库中的相关文档，生成结构化的应急预案。

工作流：
1. 理解用户输入的事件类型和事件子类
2. 参考知识库中的相关应急预案文档
3. 生成包含以下5个字段的应急预案：
   - 安全事件监测
   - 安全事件分析、定级、上报
   - 应急响应处置
   - 安全事件取证和溯源
   - 安全事件总结、结束响应

约束：
1. 严格按照JSON格式输出
2. 每个字段的内容要具体、可操作
3. 参考知识库内容，但不要完全照搬
4. 如果知识库中没有相关内容，基于专业知识生成合理的应急预案

知识库内容：
{}

输出格式：
{{
  "安全事件监测": "具体监测方法和工具...",
  "安全事件分析、定级、上报": "分析流程和定级标准...",
  "应急响应处置": "具体的处置步骤...",
  "安全事件取证和溯源": "取证方法和溯源技术...",
  "安全事件总结、结束响应": "总结报告和结束流程..."
}}
"""

# 优化特定字段的提示词
OPTIMIZE_PROMPT = """你是一个专业的应急预案优化专家，可以根据用户的优化建议对特定字段进行优化。

工作流：
1. 理解用户要优化的字段和优化建议
2. 参考历史对话内容
3. 只生成优化后的字段内容

约束：
1. 只输出优化后的字段内容，不要输出JSON格式
2. 内容要具体、可操作
3. 结合历史对话和优化建议进行改进

历史对话：
{}

要优化的字段：{}
优化建议：{}

输出格式：
直接输出优化后的字段内容，不要包含字段名和JSON格式
"""


async def generate_plan(articles: list[Article], event_type: str, event_subtype: str, 
                       optimize_field: str = None, optimize_suggest: str = None, 
                       history: list = None):
    """
    生成应急预案
    
    Args:
        articles: 相关文档列表
        event_type: 事件类型
        event_subtype: 事件子类
        optimize_field: 要优化的字段
        optimize_suggest: 优化建议
        history: 历史对话
    
    Returns:
        生成的应急预案
    """
    
    print(f"🔍 generate_plan开始处理")
    print(f"🔍 事件类型: {event_type}")
    print(f"🔍 事件子类: {event_subtype}")
    print(f"🔍 优化字段: {optimize_field}")
    print(f"🔍 优化建议: {optimize_suggest}")
    print(f"🔍 相关文档数量: {len(articles)}")
    print(f"🔍 历史对话数量: {len(history) if history else 0}")
    
    # 如果是优化模式
    if optimize_field:
        print(f"🔍 进入优化模式")
        # 构建历史对话文本
        history_text = ""
        for item in history:
            role = item.get("role", "")
            content = item.get("content", "")
            if role == "user":
                history_text += f"用户：{content}\n"
            elif role == "assistant":
                history_text += f"助手：{content}\n"
        
        print(f"🔍 历史对话文本长度: {len(history_text)}")
        
        # 使用优化提示词
        system_prompt = OPTIMIZE_PROMPT.format(
            history_text, 
            optimize_field, 
            optimize_suggest or "请优化该字段内容"
        )
        
        print(f"🔍 优化提示词长度: {len(system_prompt)}")
        
        try:
            result = await llm.http_request(
                system_prompt,
                history=[],
                prompt=f"请优化'{optimize_field}'字段的内容",
                model=MODEL_NAME
            )
            
            print(f"✅ 优化模式生成成功，结果长度: {len(result)}")
            
            # 返回优化后的字段内容
            return [{
                "field_name": optimize_field,
                "content": result
            }]
            
        except Exception as e:
            print(f"❌ 优化模式生成失败: {e}")
            import traceback
            traceback.print_exc()
            raise e
    
    # 正常生成模式
    print(f"🔍 进入正常生成模式")
    
    # 构建知识库内容
    content = ["《{}》 {}".format(x.name, x.content) for x in articles]
    content = "\n".join(content) if content else "暂无相关应急预案文档"
    
    print(f"🔍 知识库内容长度: {len(content)}")
    print(f"🔍 知识库内容预览: {content[:200]}...")
    
    # 构建系统提示词
    system_prompt = SYSTEM_PROMPT.format(content)
    
    print(f"🔍 系统提示词长度: {len(system_prompt)}")
    
    # 构建用户查询
    query = f"事件类型：{event_type}，事件子类：{event_subtype}"
    
    print(f"🔍 用户查询: {query}")
    
    try:
        result = await llm.http_request(
            system_prompt,
            history=[],
            prompt=query,
            model=MODEL_NAME
        )
        
        print(f"✅ 正常模式生成成功，结果长度: {len(result)}")
        print(f"🔍 原始结果预览: {result[:200]}...")
        
    except Exception as e:
        print(f"❌ 正常模式生成失败: {e}")
        import traceback
        traceback.print_exc()
        raise e
    
    # 尝试解析JSON结果
    print(f"🔍 开始解析JSON结果")
    try:
        # 移除可能的markdown代码块标记
        result = result.strip()
        print(f"🔍 去除首尾空白后的结果长度: {len(result)}")
        
        if result.startswith("```json"):
            result = result[7:]
            print(f"🔍 移除```json标记")
        elif result.startswith("```"):
            result = result[3:]
            print(f"🔍 移除```标记")
        if result.endswith("```"):
            result = result[:-3]
            print(f"🔍 移除结尾```标记")
        
        print(f"🔍 清理后的结果长度: {len(result)}")
        print(f"🔍 清理后的结果预览: {result[:200]}...")
        
        # 解析JSON
        plan_data = json.loads(result)
        print(f"✅ JSON解析成功")
        
        # 转换为要求的格式
        plan_list = []
        for field_name, content in plan_data.items():
            plan_list.append({
                "field_name": field_name,
                "content": content
            })
        
        print(f"✅ 转换为列表格式成功，共 {len(plan_list)} 个字段")
        return plan_list
        
    except json.JSONDecodeError as e:
        print(f"❌ JSON解析错误: {e}")
        print(f"❌ 原始结果: {result}")
        
        # 如果JSON解析失败，返回错误信息
        print(f"🔍 返回错误信息")
        return [{
            "field_name": "错误",
            "content": "应急预案生成失败，请重试"
        }] 